/*
 * interfaz.h
 *
 *  Created on: 22/09/2011
 *      Author: utn_so
 */

#ifndef INTERFAZ_H_
#define INTERFAZ_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>
#include "log.h"
#include "nipcManager.h"


typedef struct _stNodoPedido
{
	stPedido *info;
	struct _stNodoPedido *sgte;
} stNodoPedido;

struct _stDisco
{
	int32_t id;
	stNodoPedido *listaPedidos;
	int32_t socket;
	int32_t cantidadPedidos;
	pthread_t threadId;
	int32_t discoSincronizado;
	int32_t hayqueloguear;
	pthread_mutex_t *semaforoInterno;
};

typedef struct _stDisco stDisco;
typedef stDisco*  pstDisco;

typedef struct _stDatosPPD //estructura para el hilo
{
	stDisco *disco;
	char **dirIp;
	char **puerto;
	pthread_mutex_t *semaforo;
	char *horacInicioSincro;
} stDatosPPD;


///////////////////////////////PEDIDOS//////////////////////////////////////////
int32_t AgregarEscritura(stPedido *pedido);
int32_t AgregarLectura(stPedido *pedido, pthread_mutex_t *semaforo);
int32_t AgregarPedido (stDisco *disco,stPedido *pedido);
int32_t ObtenerDiscoLectura();
int32_t ObtenerDiscoLecturaConOmision(int32_t posOmitir);
void RedistribuirLecturas(stNodoPedido *listaPedidos, pthread_mutex_t *semaforo);
stNodoPedido *sacarNodoListaPedidos (stPedido *pedido,stNodoPedido **listaPedidos);
void Redistribuir(int32_t socket, pthread_mutex_t *semaforo);

/////////////////////////////SINCRONIZACION//////////////////////////////////////////
void IniciarSincronizacion(int32_t socketPPD,pthread_mutex_t *semaforo,
		long cantSectores,int32_t posDiscoASincronizar);
int32_t AgregarEscrituraSincronizacion(stPedido *pedido, pthread_mutex_t *semaforo);
int32_t cantDiscosConectados();
/////////////////////////////DISCOS//////////////////////////////////////////

void InicializarDiscos();

int32_t AgregarDisco(PAQUETE_NIPC *paq, int32_t socket, char *dirIP, char *puerto,
		pthread_mutex_t *semaforo, int32_t hayQueLoguear);
int32_t hayUnDiscoConectado();
int32_t ObtenerDiscoPorId(int32_t id);
int32_t ObtenerDiscoPorSocket(int32_t socket);
void BorrarDisco(int32_t posicion);
int32_t ObtenerDiscoVacio();
void HabilitarDisco(int32_t socket, pthread_mutex_t *semaforo);
void sacarNodoListaPedidos2 (stPedido *pedido,stNodoPedido **listaPedidos);
#endif /* INTERFAZ_H_ */
